#ifndef GY_DIALFINITE_H
#define GY_DIALFINITE_H

#include <QGraphicsItem>
#include "GY_ContainerTransform.h"
#include "GY_ControlLibrary_global.h"
#include "GY_TransformGroup.h"

class GY_CONTROLLIBRARY_EXPORT GY_DialFinite : public GY_ContainerTransform
{
    Q_OBJECT
public:
    explicit Q_INVOKABLE GY_DialFinite(const QString &guid,QGraphicsItem *parent = nullptr);
    ~GY_DialFinite();
    /**
     * @brief setContainerEditPointF 设置编辑点
     */
    void setContainerEditPointF();
    //!继承基类重写
    GY_Object * copyItem(const QString &guid = QString());
    /**
     * @brief addItem 组中添加图元
     * @param item
     * @return
     */
    virtual bool addItem(GY_Object *pItem);
    /**
     * @brief removItem 移除组中的图元
     * @param guid 图元的guid
     * @return 是否移除成功
     */
    virtual bool removItem(const QString &guid);
    /**
     * @brief removItem 移除图元
     * @param pItem 图元指针
     * @return 是否移除成功
     */
    virtual bool removItem(const GY_Object *pItem);
private:
    /**
     * @brief m_pTransFormGroup 内容器
     */
    GY_TransformGroup* m_pTransFormGroup;
    /**
     * @brief m_direction true为正方向逆时针，false反正为负方向顺时针
     */
    bool m_direction = true;
    /**
     * @brief m_oldPointAngle 上次旋转角度
     */
    qreal m_oldPointAngle = 180.0;
    qreal m_oldSweptAngle = 180.0;
private:
    /**
     * @brief initializationPropertyInfo 初始化属性信息
     */
    void initializationPropertyInfo();
    /**
     * @brief updatePosition 更新位置
     * @param name 属性名称
     * @param value 位置
     * @return 是否更新成功
     */
    bool updatePosition(const QString &name, const QVariant &value);
    /**
     * @brief updateValue 更新旋转值
     * @param name 属性名称
     * @param value 旋转值
     * @return 是否更新成功
     */
    bool updateValue(const QString &name, const QVariant &value);
    /**
     * @brief updateStartValue 更新开始旋转值
     * @param name 属性名称
     * @param value 开始旋转值
     * @return 是否更新成功
     */
    bool updateStartValue(const QString &name, const QVariant &value);
    /**
     * @brief updateEndValue 更新结束旋转值
     * @param name 属性名称
     * @param value 结束旋转值
     * @return 是否更新成功
     */
    bool updateEndValue(const QString &name, const QVariant &value);
    /**
     * @brief updateStartAngle 更新开始角度
     * @param name 属性名称
     * @param value 开始角度
     * @return 是否更新成功
     */
    bool updateStartAngle(const QString &name, const QVariant &value);
    /**
     * @brief updateSweptAngle 更新经过角度
     * @param name 属性名称
     * @param value 经过角度
     * @return 是否更新成功
     */
    bool updateSweptAngle(const QString &name, const QVariant &value);
    /**
     * @brief UpdateDraw 更新绘制
     */
    void updateDraw();
    /**
     * @brief updateInnerRadiusPoint 更新半径点2
     * @param name 属性名称
     * @param value 半径点2位置
     * @return 是否更新成功
     */
    bool updateRadiusPoint2(const QString &name, const QVariant &value);
    /**
     * @brief updateOuterRadiusPoint 更新半径点1
     * @param name 属性名称
     * @param value 半径点1位置
     * @return 是否更新成功
     */
    bool updateRadiusPoint1(const QString &name, const QVariant &value);
    /**
     * @brief updatePosition 是否隐藏
     * @param name 属性名称
     * @param value bool值
     * @return 是否更新成功
     */
    bool updateIsVisible(const QString &name, const QVariant &value);
    /**
     * @brief precalculatedPosition 计算点位置
     * @param centerPoint  中心点位置
     * @param radius 半径
     * @param angele 角度
     * @return 计算得到的点位置
     */
    QPointF precalculatedPosition(const QPointF &centerPoint, const double radius, const double angele);
    /**
     * @brief precalculatedAngle 计算相对中心点的角度
     * @param centerPoint 中心点
     * @param calculatePoint 计算点
     * @return 角度
     */
    qreal precalculatedAngle(const QPointF &centerPoint, const QPointF &calculatePoint);
    /**
     * @brief calculateRadiusPoint2Position
     * 计算半径点2位置
     */
    void calculateRadiusPoint2Position();
    /**
     * @brief calculateRadiusPoint1Position
     * 计算半径点1位置
     */
    void calculateRadiusPoint1Position();

};

#endif // GY_DIALFINITE_H
